package lock;
/*
可重入锁ReentrantLock模拟卖票
 */


import java.util.concurrent.locks.ReentrantLock;

//第一步创建资源类，定义属性和操作方法
class LTicket{

//  创建可重入锁
  private final ReentrantLock lock = new ReentrantLock(true);

//    属性：票数
  private int count = 30;
//    操作方法：卖票
  public void sale(){

    try{
//      上锁
      lock.lock();

//      判断是否有票
      if(count > 0){
//      打印出谁卖了票
        System.out.println(Thread.currentThread().getName() + "卖了：" + (count--) + " 剩下：" + count);
      }
    }finally {
//      解锁
      lock.unlock();
    }

  }
}

//第二步：创建三个线程,分别叫做AA,BB,CC，并且调用40次卖票
public class LSaleTicket {

  public static void main(String[] args) {

    LTicket lTicket = new LTicket();

    new Thread(()->{
      for(int i = 0; i < 40; i++){
        lTicket.sale();
      }
    },"AA").start();

    new Thread(()->{
      for(int i = 0; i < 40; i++){
        lTicket.sale();
      }
    },"AA").start();

    new Thread(()->{
      for(int i = 0; i < 40; i++){
        lTicket.sale();
      }
    },"AA").start();
  }
}
